package com.laity.unsafe;

import java.util.*;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 * @author: Laity
 * @Project: JavaLaity
 * @Package: com.laity.unsafe.SetTest
 * @Date: 2023年11月25日 21:57
 * @Description: 集合不安全 - Set集合不安全
 */

public class SetTest {
    public static void main(String[] args) {
        // Set<String> set = new CopyOnWriteArraySet<>();
        Set<Object> set = Collections.synchronizedSet(new HashSet<>());
        // Set<String> set = new HashSet<>();

        // 同理可证：java.util.ConcurrentModificationException ==> 并发修改异常
        /*
        解决方案：
        1、Set<Object> set = Collections.synchronizedSet(new HashSet<>());
            - 还是内部使用了Synchronized锁，性能比较低 - 不推荐
        2、Set<String> set = new CopyOnWriteArraySet<>();
            - 写入时复制：保障了效率和性能问题
            - 内部使用：final transient ReentrantLock lock = new ReentrantLock();
                ：JUC的重入锁
         */
        for (int i = 0; i < 100; i++) {
            new Thread(() -> {
                set.add(UUID.randomUUID().toString().substring(0, 5));
                System.out.println(set);
            }, String.valueOf(i)).start();
        }
    }
}
